стоп
а где заполнение массива структур?
мб все элементы массива одинаковы и ты просто инкриментишь одну и туже структуру 4 раза
создание структуры через статичный метод create идёт
В помощь тебе библиотеки(library) и базы данных.
Либы — для обращения по виду library_name.functionName(arguments)
Базы данных — для выделения юниту своих переменных.
С БД может быть момент не совсем понятным, поэтому скидываю пример:
Эта порнография разработана для личного пользования
У меня в коде есть иллюзия использования вжасса. Либа просто для доп табуляции и невостребованых манипуляций на случай импорта. При создании юнита ему присваивается ряд переменных, а номер этих переменных, относящихся к этому юниту, записывается в его(юнита) UnitUserData
library UnitDataBase
globals
constant integer UnitDBSize = 512
constant integer UnitDBHeroesStart = 0
constant integer UnitDBHeroesUnder = 49
constant integer UnitDBUnitsStart = 50//Includes illusions of heroes. Or Should include them at least :P
constant integer UnitDBUnitsUnder = 319
constant integer UnitDBSummonsStart = 320
constant integer UnitDBSummonsUnder = 511
integer UnitDBNextHero = 0
integer UnitDBNextUnit = 50
integer UnitDBNextSummon = 320
unit array UnitDBUnit[UnitDBSize]
real array UnitDBCurrentAnimationSpeed[UnitDBSize]
unit array UnitDBForceAttackTarget[UnitDBSize]
integer array UnitDBAffectedByStuns[UnitDBSize]
real array UnitDBMagicResistance[UnitDBSize]
real array UnitDBPhysResistance[UnitDBSize]
real array UnitDBCurrentArmor[UnitDBSize]//This armor does not include agility bonuses. Not used yet :>
real array UnitDBWhiteMovementSpeed[UnitDBSize]
real array UnitDBCurrentCustomSlow[UnitDBSize]
real array UnitDBMagicDamageAmplifier[UnitDBSize]
real array UnitDBPhysDamageAmplifier[UnitDBSize]
real array UnitDBAdditionalHealth[UnitDBSize]//AKA Shield. Healed whenever unit takes damage.
constant real GravityAcceleration = 14.//Azeroth, bitch!
real array UnitDBFlyingHeight[UnitDBSize]//Not used yet
real array UnitDBFallingSpeed[UnitDBSize]
integer array UnitDBItemUseVariable[UnitDBUnitsStart]//just don't ask
item array UnitDBLastUsedItem[UnitDBUnitsStart]
real array UnitDBCastPointX[UnitDBUnitsStart]
real array UnitDBCastPointY[UnitDBUnitsStart]
integer UnitDBPreviousHero//Used for exitwhen event. Its next minus two.
unit array UnitDBHeroHPBar[UnitDBUnitsStart]
unit array UnitDBHeroMPBar[UnitDBUnitsStart]
unit array UnitDBHeroSPBar[UnitDBUnitsStart]
endglobals
//Больно жирные для инлайна
function UnitDBFindNextFreeVariable takes integer i returns integer
local unit u
loop
set u = UnitDBUnit[i]
exitwhen u == null or GetUnitTypeId( u ) < 1
set i = i + 1
endloop
set u = null
return i
endfunction
function UnitDBAddHero takes unit u, real mdef, real armor returns nothing
local integer i = UnitDBNextHero
local real x = GetUnitX(u)
local real y = GetUnitY(u)
call UnitMakeAbilityPermanent( u, true, 'A00B' )
set UnitDBUnit[i] = u
call SetUnitUserData( u, i )
call GroupAddUnit( UnitsInPlayableArea, u )
set UnitDBItemUseVariable[i] = 0
set UnitDBCurrentAnimationSpeed[i] = 0.
set UnitDBAffectedByStuns[i] = 0
set UnitDBMagicResistance[i] = mdef
set UnitDBCurrentArmor[i] = armor
set UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( u )
set UnitDBCurrentCustomSlow[i] = 1.
set UnitDBMagicDamageAmplifier[i] = 1.
set UnitDBPhysDamageAmplifier[i] = 1.
set UnitDBFlyingHeight[i] = 0.//Doesn't include point height.
set UnitDBAdditionalHealth[i] = 0.
/*if ( i == UnitDBHeroesUnder ) then
call BJDebugMsg("|c00ff6060Hero limit reached! More heroes can be created, but things can go wild.")
endif*/
set UnitDBNextHero = i + 1
set UnitDBPreviousHero = i - 1
set UnitDBHeroHPBar[i] = CreateUnit(BossPlayer1, 'hmil', x, y, 0. )
call SetUnitAnimationByIndex( UnitDBHeroHPBar[i], 100 )
set UnitDBHeroMPBar[i] = CreateUnit( BossPlayer1, 'hrtt', x, y, 0. )
call SetUnitAnimationByIndex( UnitDBHeroMPBar[i], 100 )
set UnitDBHeroSPBar[i] = CreateUnit( BossPlayer1, 'hwt2', x, y, 0. )
call SetUnitAnimationByIndex( UnitDBHeroSPBar[i], 0 )
set u = null
return
endfunction
function UnitDBAddUnit takes unit createdUnit, real mdef, real armor returns nothing
local integer i = UnitDBNextUnit
local unit u = UnitDBUnit[i]
if ( u == null ) then
set i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
endif
set UnitDBUnit[i] = createdUnit
call SetUnitUserData( createdUnit, i )
call GroupAddUnit( UnitsInPlayableArea, createdUnit )
set UnitDBCurrentAnimationSpeed[i] = 0.
set UnitDBAffectedByStuns[i] = 0
set UnitDBMagicResistance[i] = mdef
set UnitDBCurrentArmor[i] = armor
set UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( createdUnit )
set UnitDBCurrentCustomSlow[i] = 1.
set UnitDBMagicDamageAmplifier[i] = 1.
set UnitDBPhysDamageAmplifier[i] = 1.
set UnitDBFlyingHeight[i] = 0.
set UnitDBAdditionalHealth[i] = 0.
if ( i < UnitDBSummonsUnder) then
set UnitDBNextSummon = i + 1
else
set UnitDBNextSummon = UnitDBSummonsStart
endif
set u = null
set createdUnit = null
return
endfunction
function UnitDBAddSummon takes unit summonedUnit, real mdef, real armor returns nothing
local integer i = UnitDBNextSummon
local unit u = UnitDBUnit[i]
if ( u == null ) then
set i = UnitDBFindNextFreeVariable( UnitDBSummonsStart )
endif
set UnitDBUnit[i] = summonedUnit
call SetUnitUserData( summonedUnit, i )
call GroupAddUnit( UnitsInPlayableArea, summonedUnit )
set UnitDBCurrentAnimationSpeed[i] = 0.
set UnitDBAffectedByStuns[i] = 0
set UnitDBMagicResistance[i] = mdef
set UnitDBCurrentArmor[i] = armor
set UnitDBWhiteMovementSpeed[i] = GetUnitDefaultMoveSpeed( summonedUnit )
set UnitDBCurrentCustomSlow[i] = 1.
set UnitDBMagicDamageAmplifier[i] = 1.
set UnitDBPhysDamageAmplifier[i] = 1.
set UnitDBFlyingHeight[i] = 0.
set UnitDBAdditionalHealth[i] = 0.
if ( i < UnitDBSummonsUnder) then
set UnitDBNextSummon = i + 1
else
set UnitDBNextSummon = UnitDBSummonsStart
endif
set u = null
set summonedUnit = null
return
endfunction
//Система маг резиста была изменена на дефолтную, была введена аналогичная ей система физ урона.
//Необходимо протестить эти системы на низких значениях. (могучий float и его точность). В нынешних условиях низкие значения не достигаются. На тест положен болт. Есть нерешенные проблемы с точностью(при восстановлении, опять же, резисты съезжают). Необходимо учитывать при вычислениях лишь первые три цифры после запятой, например.
#define UnitDBIncreaseUnitMagicResistance( amount, userData ) = {
set UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] * amount
}
#define UnitDBDecreaseUnitMagicResistance( amount, userData ) = {
set UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / amount
if ( UnitDBMagicResistance[userData] > 0.99997 and UnitDBMagicResistance[userData] < 1.00003 ) then
set UnitDBMagicResistance[userData] = 1.
endif
}
#define UnitDBIncreaseUnitPhysResistance( amount, userData ) = {
set UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] * amount
}
#define UnitDBDecreaseUnitPhysResistance( amount, userData ) = {
set UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / amount
if ( UnitDBPhysResistance[userData] > 0.99997 and UnitDBPhysResistance[userData] < 1.00003 ) then
set UnitDBPhysResistance[userData] = 1.
endif
}
#define UnitDBReplaceUnitMagicResistance( before, after, userData ) = {
set UnitDBMagicResistance[userData] = UnitDBMagicResistance[userData] / before * after
}
#define UnitDBReplaceUnitPhysResistance( before, after, userData ) = {
set UnitDBPhysResistance[userData] = UnitDBPhysResistance[userData] / before * after
}
#define UnitDBIncreaseUnitMagicDamageAmplifier( amount, userData ) = {
set UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] + amount
}
#define UnitDBDecreaseUnitMagicDamageAmplifier( amount, userData ) = {
set UnitDBMagicDamageAmplifier[userData] = UnitDBMagicDamageAmplifier[userData] - amount
if ( UnitDBMagicDamageAmplifier[userData] > 0.99997 and UnitDBMagicDamageAmplifier[userData] < 1.00003 ) then
set UnitDBMagicDamageAmplifier[userData] = 1.
endif
}
#define UnitDBIncreaseUnitPhysDamageAmplifier( amount, userData ) = {
set UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] + amount
}
#define UnitDBDecreaseUnitPhysDamageAmplifier( amount, userData ) = {
set UnitDBPhysDamageAmplifier[userData] = UnitDBPhysDamageAmplifier[userData] - amount
if ( UnitDBPhysDamageAmplifier[userData] > 0.99997 and UnitDBPhysDamageAmplifier[userData] < 1.00003 ) then
set UnitDBPhysDamageAmplifier[userData] = 1.
endif
}
#define UnitDBIncreaseUnitShield( amount, userData ) = {
set UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] + amount
//redraw
}
#define UnitDBDecreaseUnitShield( amount, userData ) = {
set UnitDBAdditionalHealth[userData] = UnitDBAdditionalHealth[userData] - amount
if ( UnitDBAdditionalHealth[userData] < 0. ) then//Perhaps should be typed manually on every use. No need of that atm.
set UnitDBAdditionalHealth[userData] = 0.
endif
//redraw
}
function UnitDBAddUnitsCreatedOnInit takes nothing returns nothing
local unit u = GetEnumUnit()
if ( not IsUnitType( u, UNIT_TYPE_HERO ) ) then
call UnitDBAddUnit( u, 1., 0. )//!!! whatever
endif
set u = null
return
endfunction
endlibrary
allocate() используется внутри статичного метода и возвращает лишь индекс новой структуры
Технически верно, но на практике использовать .allocate() есть смысл только при перегрузке .create() (равно как и .deallocate() только при перегрузке .destroy()). Собственно, согласно документации, для того эти методы и существуют.
Напиши простейший код, скомпиль и посмотри во что превращается. Никаких структур в движке варика нет, вжасс это надстройка которая транспилит в обычный жасс.
struct linkedList
private static constant timer period = CreateTimer( )
private thistype prev
private thistype next
private stub method destroy takes nothing returns nothing
// Здесь должен находится Ваш код.
set this.prev.next = this.next
set this.next.prev = this.prev
if ( thistype( 0 ).next == 0 ) then
call PauseTimer( thistype.period )
endif
call thistype.deallocate( this )
endmethod
private static method iterate takes nothing returns nothing
local thistype this = thistype( 0 ).next
loop
exitwhen ( this == 0 )
// Здесь должен находится Ваш код.
call this.destroy( )
set this = this.next
endloop
endmethod
private static method create takes nothing returns thistype
local thistype this = thistype.allocate( )
set this.next = thistype( 0 )
set this.prev = thistype( 0 ).prev
set this.next.prev = this
set this.prev.next = this
// Здесь должен находится Ваш код.
if ( this.prev == 0 ) then
call TimerStart( thistype.period, 0.03125, true, function thistype.iterate )
endif
return this
endmethod
endstruct
Через триггеры и способности. Дать спосбность морфа и приказать ее использовать. Предварительно создать новую альтернативную единицу с другой моделью
Для героев:
Перевоплощение - Иллидан
Превратиться в кибергоблина (Проверено - работает)
В программе War3ModelEditor можно автоматически рассчитать границы. Но перед этим нужно вывести хотя бы одну точку на необходимое расстояние. После чего точку можно удалить.
Nelloy, если найдёт где в памяти хранится модель после чего сам создаст модель из файла и заменит модель юнита на новую то можно Pergin, гугли memory hack war3
это сложно и требует от тебя больших знаний в джасс и понимания работы движка игры
без этого даже не пытайся
либо делай через морф
как морфить одного юнита в другого написано в статьях
Чтобы было норм читать, надо хотя бы выделять содержимое каждого блока (типа function/endfunction, if/endif, loop/endloop) табуляцией. Если блок внутри блока, то двойная табуляция, и т. д.
В vJASS и cJASS не стоит использовать одновременно C-подобный и Turing-подобный (стандартный JASS) синтаксис.
А если ты неправильно поставишь пробелы, запятые или кавычки, тебе об этом скажет парсер =)
Во-первых, что есть "локальный таймер" ? Это таймер записанный в локальную переменную?
Во-вторых, зачем тебе точка, если ты используешь XY ? Работай с ними
В-третьих, да. Использование в течении всей игры одной заранее созданной точки вызывает меньше нагрузки чем постоянно создание и удаление новых (кто-то там доказывал на примере и цифрами что от ремувнутых точке всё равно остаётся шлак в памяти...)
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Карта с нестандартными молниями и описанием. Смотреть Readme в менеджере импорта.
Если тебе типа фиолетовой молнии рубика надо, то вот есть вроде этого
Если указываешь в настройках материала "Id анимации текстуры", то после сохранения этот параметр опять сбрасывается в "none". Решение:
Сохранить в .mdl, открыть блокнотом. Ищем нужный материал, добавляем новую строчку TVertexAnimId и после пробела ставим id нужной анимации текстуры(обычно 0). Затем кодируем в mdx с помощью MdlVis.
Пример:
Кажется ты не понимаешь, как работают фильтры альфы.
Не понимаю. Как раз поэтому и задал вопрос.
В ME открой модель. Там есть фильтры Addative и Add Alpha, которые работают схожим образом: чем темнее, тем прозрачнее(черный = 100%). Есть какой то альтернативный фльтр, вроде Modulate, который отображает белый как прозрачный. Посмотри в материалах(Window\Material manager\).
Это касательно отображения.
А ошибка скорее всего не в том, но попроси изменить эффект того, кто в этом шарит, ведь если она выбивает после того, как его редактировал ты, значит ты где то напартачил.)
там найти все источники частиц (у них иконки в виде синих/красных стрелочек)
два раза щелкнуть на источник, откроется окно редактирования
там обычно три цвета, вот их можно поменять нажав на кнопку "..." рядом с каждым, открывается цветовой диалог; еще в этом окне можно посмотреть/поменять текстуру источника
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
В триггере с инициализацией создаешь действие: Игрок - make Ю2 недоступно for training by игрок.
Создаешь триггер: юнит завершает исследование (твой аналог берсерка) - заблокировать Ю1 (как в пункте 1), а Ю2 - разблокировать.
Создаешь способность на основе Безумие (Sbsk), указываешь в графе "новый тип войск" Ю2, даешь эту способность Ю1.
похоже что придется делать обычный блокиратор путей, а для посадки можно просто повысить радиус действия данной способности, чтобы она была дальше самого тонкого блокиратора пути. Теоретически должно сработать
Тебе описали несколько алгоритмов решения возникшей задачи и средства, с помощью которых они могут быть реализованы; реализация решения остаётся за тобой как за тем, у кого эта задача возникла.
Ты также можешь отказаться от решения задачи, но не имеешь никакого морального права требовать реализовать это решение за тебя.
Берёшь координаты, или точку (одно и другого получить можно, в обе стороны)
Проверяешь подходит ли точка для плавания
Если да - то это либо мелководье, либо глубоководье
Проверяешь подходит ли точка для ходьбы
Если нет - это глубоководье, если да - это мелководье
Далее ты можешь ещё проверить уровень склона (клифф) в точке, но проверки на проходимость и так должно быть достаточно... проверкой уровня ты лишь получишь то на какой высоте эта вода... (а она может быть на разных высотах).
Почему то на таймере всё забагалось и прилетало по несколько ивентов, сделал на периодическом триггере и всё стало нормально.
Код
globals
region region123
trigger trg = CreateTrigger()
real maxX
real minX
real maxY
real minY
real pointX
real pointY
endglobals
function Run takes nothing returns nothing
if pointY < minY then
call TriggerRegisterEnterRegion( gg_trg_enter, region123, null )
call TriggerRegisterLeaveRegion( gg_trg_leave, region123, null )
call DisableTrigger( trg )
endif
if pointX > maxX then
set pointY = pointY-32.00
set pointX = minX
endif
if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
call RegionAddCell( region123, pointX, pointY )
endif
set pointX = pointX+32.00
endfunction
function Trig_trg_Actions takes nothing returns nothing
set region123 = CreateRegion()
set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
set minX = GetRectMinX(bj_mapInitialPlayableArea)
set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
set minY = GetRectMinY(bj_mapInitialPlayableArea)
set pointX = minX
set pointY = maxY
call TriggerRegisterTimerEvent( trg, 0., true )
call TriggerAddCondition( trg, Condition(function Run) )
endfunction
//===========================================================================
function InitTrig_trg takes nothing returns nothing
call Trig_trg_Actions()
endfunction
Вот карта с примером (карту сохранить не сможешь, т.к тебе нужен будет JNGP, это просто чтобы ты посмотрел сам алгоритм)
И учти что чем больше карта, тем больше времени нужно алгоритму что построить регион
The Dude, это несерьезно. Все вопросы описаны в большом количестве статей здесь, на нашем сайте - xgm.guru/p/wc3/articles. То, что перечисляешь не верх мастерства WE, а базовые знания. Материалов предостаточно. Успехов в обучении.
как и со всеми остальными объектами при правильном использовании утечек нету
при неправильном утечек дофига
а так утечки можно наплодить чем угодно кроме чисел, буленов и игроков
На основе полностью триггерного снаряда, сделанного из работника (если вам так интересно).
Если сало выучит глейвы, то будет получать бонусы интелекта (если мне не изменяет память), сам снаряд тупо юнит которого двигают с сайленсером и проверяют жив ли он.
Могу выложить код сайленсера.
Экстрасенсы чувствуют что ты шаришь только в GUI, так что замути абилку на основе канала с временем каста 2.33 и нужной анимацией. Она, правда, как-то хреново взаимодействует со станами - не кислотной бомбой (или че-то такое, никогда не сталкивался, пофиг), но послужит тебе верно. При спавне просто кастуй абилку.
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.
Я припоминаю как сталкивался с таким. Скорее всего это не лечится. Можно попробовать создавать даммика на месте здания и заставлять его использовать заклинание. Или даже полностью самому написать спелл - он довольно прост.
Не берите вы эти ульты для основы своих скиллов, они сделаны через одно место лиж бы работали в капмании, а там дальше хоть потоп.
Сделайте заклинание из канала, а юнитов вокруг делайте неуязвимыми.
Атака оглушением вызывает подобную ерунду. Да и не только.
Например в доте бы вылетало сообщение 0 при атаке имея МКБ - сообщался бы урон, урон от микробаша, если бы выпал и 0.00 от нулевого критического удара.
Решение простое - поставь условие, что полученный урон больше 0.00, тогда только выводить.
Нужно менять 'AHtb' - это код способности (соответственно - молот бурь). Сюда нужно вставить код своей способности.
Ctrl+D в РО отображает коды. А может и не Ctrl+D, но будет прикольно, если я вспомнил.
Ну это сплеш, на тип урона не проверял, область настраивается и кол-во урона, оно же урон по аое.
Не все, а орбы предметов, орб может включить вторую атаку героя, только если она изначально выключена и есть. По этой причине владельцы орбов порой считаются юнитами дальнего боя, что разумеется не так (вторая атака всегда атака дальнего боя у всех дефолтных героев в варкравте, особо вторую атаку никто не настраивает.)
В орбах вроде сферы огня нету ничего интересного или полезного, лучше делать руками те эффекты которые они дают.
1 - не стоит создавать отдельный триггер для способности с периодом в 0.5 секунды
2 - об утечках триггера 003 не говорю, думаю сам знаешь
3 - второй триггер очевидно у тебя не работает? Потому что Triggering Unit'а просто нет в событии
Что я тебе предлагаю:
В первом триггере все тоже собитие\условие, в действии повышатьуроверь способности на базе Жара прейсподней(пассивного), ну конечно поменяешь в РО эффекты и др. И по истечении времени менять уровень на 1 этой способности. Как сделать чтоб не было видно иконки этого Жара? Добавляешь её в спец.созданную Книгу заклинаний и триггерно, к примеру на Map Init запрещаешь использовать игроку эту Книгу заклинаний.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
"Далеко твоя рпг не уйдёт" моя рпг тебя переживет.
Ты тоже когда родился не умел так нагло хамить незнакомым людям, научился же как то. Люди с более серьезным отношением к миру чем "изменить систему один не могу но буду плакать об этом" могут изучить все что захотят и даже в одиночку будут стоить больше чем тысяча "всегда сдающихся" людей,
и тот человек (Да удалось, даже был лаунчер для этой игры. Forgotten Land) это подтвердил, хотя я уверен что он быстро опустил руки.
p.s чел прекращай настраивать других людей на поражение, если ты что-то можешь дать - дай, если хочешь чтобы другие не добились успеха чтобы ты оказался прав и не чувствовал себя ущербным то просто отойди в сторону.
Я на все твои выпады отвечу лишь одной фразой:
"Dota была обычной картой для warcraft 3 и она поначалу тоже была пустой ".
Ответы получены, пару шарящих людей нашел, (дай бог каждому такого человека который рассказал мне о многом что тут считают до сих пор невозможным)
Спасибо за поддержку! и особенно одному пользователю. Ведь именно благодаря таким людям как life2smiler, люди не делают хорошие проэкты а другие люди соответственно вынуждены играть в некачественные карты и в течении нескольких лет не находить решения наболевших проблем
(если нет хотя бы 1 го человека кому удалось сделать что-то необычное то все остальные продолжат считать это невозможным) А сегодня стало ясно что могут не знать о чем либо не только потому что никто не делал этого, а потому что человек на самом деле сделал но никому говорить не стал :)
поставить в РО у юнита "требования" на технологию, и теперь пока она не изучена, они не будут доступны. И может быть еще способностях надо будет покопаться и в технологиях
да я решыл проблему я просто перегрузил комп
Я понел в чом проблема я поставил в vjass 2 галки нижние включил из надо отключать и тогды проблем не будет
Проблема решена. Я сделал так: Удалил все триггеры и потом по папочке восстанавливал, когда нашли в чем проблема удалили триггер и все заработало, спасибо за помощь!
Чтобы было норм читать, надо хотя бы выделять содержимое каждого блока (типа function/endfunction, if/endif, loop/endloop) табуляцией. Если блок внутри блока, то двойная табуляция, и т. д.
В vJASS и cJASS не стоит использовать одновременно C-подобный и Turing-подобный (стандартный JASS) синтаксис.
А если ты неправильно поставишь пробелы, запятые или кавычки, тебе об этом скажет парсер =)
Во-первых, что есть "локальный таймер" ? Это таймер записанный в локальную переменную?
Во-вторых, зачем тебе точка, если ты используешь XY ? Работай с ними
В-третьих, да. Использование в течении всей игры одной заранее созданной точки вызывает меньше нагрузки чем постоянно создание и удаление новых (кто-то там доказывал на примере и цифрами что от ремувнутых точке всё равно остаётся шлак в памяти...)
ответ - в структурах не должно быть глобальных переменных
Ответ неверен. Внутри структуры не может быть блока globals, потому что это бессмысленно: все поля в структуре уже являются глобальными переменными.
struct MyStruct
unit u // На самом деле будет создан глобальный массив юнитов.
static unit u2 // Будет создана 1 глобальная переменная типа юнит.
endstruct
перемещать
при создание идёт выделение памяти а при перемещение лишь изменение полей объекта
но всё зависит от интервала и количества предметов
ибо уже при 400 предметах бывают лаги
Custom, Никак, HeroAbilityList низя править во время игры, делайте несколько героев с разными наборами скиллов на изучение, а потом морфите.
Как правильно морфить можно найти инфу тут.
Перед морфом желательно убирать все предметы из инвентаря.
Код выше имеет вероятность вызвать фатал (от драколича инфа, что из-за чтения памяти по несуществующему адресу, я пока отталкиваюсь от того, что из-за несуществующей точки мб втч).
Уже был промежуточный вариант номер 2, он фатал вызвал сразу после сборки линзы, что подтверждает отчасти моё мнение...
Сейчас тестирую этот. По крайней мере линза с ним собралась уже без фатала.
Новый тест код линзы (ща главное, чтобы работал)
ЭФИРНАЯ ЛИНЗА
function AetherLens_Actions takes nothing returns nothing ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0 ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
if GetSpellTargetLoc() != null then
set p2 = GetSpellTargetLoc()
endif
endif
if p2 != null then
if ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
if DistanceBetweenPoints(p,p2) > 200 then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest"))
if GetAbilityDataHeroRng(a, i) > 200 and GetAbilityDataHeroRng(a, i) < 1000 and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endloop
endif
endif
endif
call RemoveLocation (p2)
endif ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
call RemoveLocation (p)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
set u5 = null
set u6 = null
set p = null
set p2 = null ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
===========================================================================
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
ЭФИРНАЯ ЛИНЗА - ЗАКРЫТО.
Если что: в первичном коде не было вообще предусмотрено, что точки p2 может не существовать и что в таком случае делать.
nvc123, если честно мне его действия очень напоминают хитрое попрошайничество. Да и на сайте тем по типу - "Как посчитать количество предметов в области" уже штук 3-4 было. Да и я бы ему рекомендовал провернуть такой трюк сначала с одним предметом а потом понять принцип и склепать по аналогии еще сколько нужно раз. И не проще ли сделать 1 круг для все этих 10 предметов и рядом круг для жертвы?
во первых: не надо дублировать вопросы
во вторых: у меня твоя карта открывается
правда я не настолько сумасшедший чтобы юзать вин10
в третьих: размер мапы большой и может тупо не хватать памяти (особенно если юзаешь вин10)
советую попробовать переустановить jngp
если не поможет то сменить винду
JNGP снимает ограничения (например максимум декорации 20к), если обычным редактором открыть критует. В jngp есть новые гуишные функции, которых нет в обычном, стандартный редактор их не распознает. Юзайте поиск, такой вопрос уже задавали
Нашел! добавил! Тест, все хорошо! Пока, еще повтор проверяет!
Недостающий прелоад, Red_Glow3.blp и Dust5A.blp , также Clouds8x8.blp и ShockwaveWater1.blp и EQ_Rock2.blp
При определенных навыках даже в War3 Model Editor можно серьезно облегчить модель. Можно полюбопытствовать о том, что это за модель? Возможно решение гораздо проще, чем тебе кажется.
Нужен набор программ виз,в3ме, блплаб, фотошоп, текстовый редактор - самый хороший результат, но нужны определенные навыки,
При конвертации моделей из игр в MDX их вес велик как и вес их текстур ! Я оптимизирую и сжимаю модель через MDLvis а текстуры через BLP Laboratory но их вес все еще внушителен ( Есть ли другие варианты среза веса без дефектов материала ?
Нет. Только удаление лишних анимаций. Остальную оптимизацию веса сделает mdlvis.
При импорте некоторых моделей в карту возникает проблема с их выбором при манипуляции ( Передвижения ) словно их Выбор отсутствует , Думаю некоторые с подобным сталкивались ...
Если модель нельзя выделить в игре курсором, у неё отсутствуют collision shapes (формы коллизии). Их можно добавить в War3ModelEditor -> Окна -> Редактор узлов -> правый клик -> Создать форму - > отредактировать размеры и положение. Их можно добавить несколько, чтобы покрыть модель целиком. Они отвечают за взаимодействие модели с курсором.
Один ресурс - один вопрос, после пойдут замечания.
8gabriel8, Вот, упрямый ведь! Берёшь скачиваешь свою модель, которую ты кинул в топик, рассчитываешь границы, импортируешь, для точности в новую карту 32x32 и если после этого портрет невидим, я в блоге напишу, что я гей. Конечно при условии, что ты все правильно сделаешь.
а ты уверен что в папке есть файлы в формате mpq?
ну а вообще мы не телепаты чтобы так сказать в чём проблема
больше инфы
скрины, версия студии, ос
так же попробуй открыть архивы в другом архиваторе
например в mpqMaster
повторю опять свой вопрос
у тебя в папке есть файлы формата mpq?
если есть то открой их другим архиватором
если нету то это твои проблемы и никто тебе не поможет
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим) nvc123:
Чтобы при подборе меча игрались анимации для меча - можно укзать
Анимация - add animation tag to unit - first например. Будут проигрываться attack first, walk first и т.д. При отсутствии таковых будут играться бестеговые анимации.
Теги не какие попало добавляются, насколько я помню.
Используемые теги: fast, victory, first, second,third, fourth, fifth, swim, ready, alternate.
Ошибка при работе с MdlVis. Попробуй открыть модель в версии 1.40, там должно изменение видимости в ключевых кадрах должно заработать. Однако советую сделать копию модели, т.к. 1.40, если не изменяет память, ломает уже настроенную видимость.
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
» WarCraft 3 / vjass структуры, проблема наследования
» WarCraft 3 / Модели Юнита
» WarCraft 3 / Экран статистики
» WarCraft 3 / Вопрос по Jass
» WarCraft 3 / Урон в зависимости характеристик
» WarCraft 3 / эффект
» WarCraft 3 / Вода
» WarCraft 3 / Вопрос по заданиям.
» WarCraft 3 / Вопрос про облости
» WarCraft 3 / Пассивная способность героя
» WarCraft 3 / Скелеты из атаки
» WarCraft 3 / Заговор неуязвимости не работает у здания
» WarCraft 3 / 2 цифры урона
» WarCraft 3 / Особый персонаж
» WarCraft 3 / Сделать берсерка доступным
» WarCraft 3 / Проверка на уровень предмета.
» WarCraft 3 / Проблема с редактором
» WarCraft 3 / Вопрос по Jass
» WarCraft 3 / Общая лесопилка
» WarCraft 3 / Удалить предметы в области
» WarCraft 3 / Не открывается карта
» WarCraft 3 / Оптимизация моделей
» WarCraft 3 / wow в warcraft
» WarCraft 3 / Проблема с анимациями